Colegio Universitario de Cartago

Carrera de Big Data

BD-132 Programacion I

Proyecto #2

Realizado por: Mariel Rodriguez , Johel Barquero, Pablo Marín y Wedell Orozco

Docente: Ericka Celina Valverde Navarro

Fecha presentación de investigación:

Librerias

library(readr)#importación de datos
library(dplyr)#manipulación de datos
library(DT)#tablas interactivas
library(ggplot2)#creación de gráficos
library(tidyr)#Limpieza de datos
library(fmsb)#gráficos de radar etc
library(gridExtra)#Combinar los gráficos
library(plotly)

Set de Datos

#Dataset original jugadores de fifa21
origi_data21 <- read_csv("players_21.csv", col_names = TRUE)
#Dataset original jugadores de fifa22
origi_data22<-read_csv("players_22.csv", col_names = TRUE)
#Dataset original jugadores de fifa15
origi_data15<-read_csv("players_15.csv", col_names = TRUE)

Selección de columnas necesarias:

Esta función busca las columnas necesarias del dataset original y crea uno nuevo y le agrega una columna nueva de clasificación

fun_dataNecesaria <- function(data) { # Seleccionar columnas deseadas
  data <- data[, c("short_name", "player_positions", "overall", "potential",
                   "value_eur", "age", "club_name", "league_name", "nationality_name",
                   "preferred_foot", "pace", "shooting", "passing", "dribbling",
                   "defending", "physic")] 
  # Agregar columna de clasificación 
  data$clasificacion <- NA
  for (i in 1:nrow(data)) {
    if (data$overall[i] >= 80) {
      data$clasificacion[i] <- "Elite"
    } else if (data$overall[i] >= 60) {
      data$clasificacion[i] <- "Bueno"
    } else {
      data$clasificacion[i] <- "Promedio"
    }
  }
  return(data)
}

Data a utilizar

fdata_15<-fun_dataNecesaria(origi_data15)
fdata_21<-fun_dataNecesaria(origi_data21)
fdata_22<-fun_dataNecesaria(origi_data22)

Conocimiento de los datos

names(origi_data21)#Columnas del set de datos
#Visión general del set de datos
str(origi_data21)
glimpse(origi_data21)

#Nulos set de datos players_21
any(is.na(fdata_21))#Conocimiento de valores nulos
sum(is.na(fdata_21))#Suma total de valores nulos
sapply(fdata_21, function(x) sum(is.na(x)))# Contar valores NA por columna

#Nulos set de datos players_22
any(is.na(fdata_22))#Conocimiento de valores nulos
sum(is.na(fdata_22))#Suma total de valores nulos
sapply(fdata_22, function(x) sum(is.na(x)))# Contar valores NA por columna

Data y dimenciones:

Tablas de los set de datos utilizados años (2021-2022)

fdata_21
dim(fdata_21)
## [1] 18944    17
fdata_22
dim(fdata_22)
## [1] 19239    17
fdata_15
dim(fdata_15)
## [1] 16155    17

Hipotesis #1

¿Cuál es la mayor conformación de jugadores “Elite” en las 5 grandes ligas?

Datos de las 5 grandes ligas

Esta función reune la información de las que consideramos las 5 grandes ligas Spain Primera Division,Premier League, Serie A,Bundesliga,Ligue 1

#Datos de las 5 grandes ligas/ Funcion que busca datos de las 5 grandes ligas 
fun_best_league<-function(data){
  result_five<-data %>% 
  filter(league_name %in% c("Spain Primera Division","English Premier League",                              "Italian Serie A","German 1. Bundesliga",
                            "French Ligue 1") & clasificacion == "Elite" )
  return(result_five)
}
five_data15<-fun_best_league(fdata_15)#Del Dataset ingresado saca data de las 5 grandes ligas

five_data22<-fun_best_league(fdata_22)

Resultado de las mejores ligas

# Función que crea un gráfico de barras interactivo con los resultados de los jugadores élite de cada liga
fun_grafico_jugadores_elite_plotly <- function(data_final, year) {
  # Contar el número de jugadores élite por liga
  data_contada <- data_final %>%
    count(league_name)
  
  # Crear el gráfico de barras interactivo
  barras_plot1 <- plot_ly(
    data = data_contada,
    x = ~league_name,
    y = ~n,  # 'n' es la columna generada por count() que contiene el conteo
    type = 'bar',
    marker = list(color = 'rgba(31, 119, 180, 0.8)', line = list(color = 'rgba(0, 0, 0, 1.0)', width = 1.5)),
    text = ~n,
    textposition = 'auto',
    hoverinfo = 'x+y'
  ) %>%
    layout(
      title = paste("Distribución de jugadores Elite por liga (", year, ")"),
      xaxis = list(
        title = "Ligas",
        tickvals = c("Spain Primera Division", "English Premier League", "Italian Serie A", "German 1. Bundesliga", "French Ligue 1"),
        ticktext = c("La Liga (España)", "Premier League (Inglaterra)", "Serie A (Italia)", "Bundesliga (Alemania)", "Ligue 1 (Francia)"),
        tickangle = -45  # Rotar las etiquetas del eje x para mejor legibilidad
      ),
      yaxis = list(title = "Número de Jugadores"),
      plot_bgcolor = "#C1CDC1"
    )
  
  return(barras_plot1)
}
fun_grafico_jugadores_elite_plotly(five_data15, 2015)
fun_grafico_jugadores_elite_plotly(five_data22,2022)

Comparación final

# Función que crea un gráfico de barras comparativo sobre los jugadores élite por liga
fun_grafico_comparativo_barras_plotly <- function(data1, data2, year1, year2) {
  # Añadir la columna de año a cada conjunto de datos
  data1$year <- as.character(year1)
  data2$year <- as.character(year2)
  
  # Combinar los conjuntos de datos
  union_data <- rbind(data1, data2)
  
  # Agrupar y contar el número de jugadores élite por liga y año
  data_contada <- union_data %>%
    group_by(league_name, year) %>%
    summarise(n = n())
  
  # Crear el gráfico de barras interactivo
  barras_plot2 <- plot_ly(
    data = data_contada,
    x = ~league_name,
    y = ~n,
    color = ~year,
    type = 'bar',
    text = ~paste(n),
    textposition = 'outside',
    hoverinfo = 'text+y'
  ) %>%
    layout(
      title = paste("Comparativa de Jugadores Elite por Liga (", year1, "vs", year2, ")"),
      xaxis = list(
        title = "Ligas",
        tickvals = c("Spain Primera Division", "English Premier League", "Italian Serie A", "German 1. Bundesliga", "French Ligue 1"),
        ticktext = c("La Liga (España)", "Premier League (Inglaterra)", "Serie A (Italia)", "Bundesliga (Alemania)", "Ligue 1 (Francia)"),
        tickangle = -45  # Rotar las etiquetas del eje x para mejor legibilidad
      ),
      yaxis = list(title = "Jugadores Elite"),
      barmode = 'group',  # Agrupar las barras por año
      plot_bgcolor = "#C1CDC1",
      bargap = 0.2,       # Espacio entre las barras
      bargroupgap = 0.1   # Espacio entre los grupos de barras
    )
  
  return(barras_plot2)
}                     
fun_grafico_comparativo_barras_plotly(five_data15, five_data22, 2015, 2022)

Hipotesis #3

Conforme al potencial actual del jugador¿Cómo evolucionaría en la siguiente temporada?

Habilidades de los jugadores

Se creo una función para crear un nuevo dataframe solo con las habilidades de cada jugador

#Función para crear un nuevo dataframe solo con las habilidades de cada jugador 
fun_habilidades<- function(data){#data == al set de datos a utilizar
 
  data<-data %>% #Creacion de dataframe con las habilidades de los jugadores
  select(short_name,potential, everything()[11:16])

#Limpieza de los datos(Eliminancion de NA no se uso por no tener informacion sobre sus estadisticas)
 data<-data %>% 
  drop_na()
 
 return(data)
}


habilidades_15<-fun_habilidades(fdata_15)#///
habilidades_15

Predicción de habilidades

Se creo una funcion que tiene como proposito tratar de predicir las habilidades de los jugadores para la siguiente temporada

#2.Dataframe para la prediccion de los jugadores 
fun_predicion_players <- function(data) {
  data<-data %>% 
    drop_na()
  # Seleccionar las columnas específicas
  data <- data %>% 
    select(short_name, potential, pace, shooting, passing, dribbling, defending, physic)
  
  # Evaluar y modificar las columnas de habilidades
  for (i in 1:nrow(data)) { 
    if (data$potential[i] >= 90) { 
      data[i, c("pace", "shooting", "passing", "dribbling", "defending", "physic")] <- 
        data[i, c("pace", "shooting", "passing", "dribbling", "defending", "physic")] + 1 
    } else if (data$potential[i] >= 70) { 
      data[i, c("pace", "shooting", "passing", "dribbling", "defending", "physic")] <- 
        data[i, c("pace", "shooting", "passing", "dribbling", "defending", "physic")] + 2 
    } else if (data$potential[i] >= 60) { 
      data[i, c("pace", "shooting", "passing", "dribbling", "defending", "physic")] <- 
        data[i, c("pace", "shooting", "passing", "dribbling", "defending", "physic")] - 1 
    } else { 
      data[i, c("pace", "shooting", "passing", "dribbling", "defending", "physic")] <- 
        data[i, c("pace", "shooting", "passing", "dribbling", "defending", "physic")] + 0 
    }
  }
  
  return(data)
}

predic_2015<-fun_predicion_players(fdata_15)

head(predic_2015)

Nota general de los jugadores

#3.Funcion que calcular la nota general de las habilidades de un jugador 
fun_overall_player <- function(player, data) {
  # Defenicion de pesos
  pesos <- c(pace = 0.2, shooting = 0.2, passing = 0.2, dribbling = 0.2, defending = 0.1, physic = 0.1)
  
  # Filtrar el dataframe para obtener el jugador específico
  solicitud <- data %>%
    filter(short_name == player)
  
  if (nrow(solicitud) == 0) {
    print("Jugador no encontrado")
  }
  
  # Calcular el overall_habilidad usando sapply
  overall_habilidad <- sapply(1:nrow(solicitud), function(i) {
    sum(as.numeric(solicitud[i, c("pace", "shooting", "passing", "dribbling", "defending", "physic")]) * pesos)
  })
  
  # Crear un dataframe con los resultados deseados
  resultado <- data.frame( short_name = solicitud$short_name, 
                           potential = solicitud$potential,
                           pace = solicitud$pace,
                           shooting = solicitud$shooting,
                           passing = solicitud$passing,
                           dribbling = solicitud$dribbling,
                           defending = solicitud$defending,
                           physic = solicitud$physic,
                           overall_habilidad = overall_habilidad )
  
  return(resultado)
}

fun_overall_player("L. Messi", fdata_15)
fun_overall_player("L. Messi", predic_2015)

Comparativa del desarrollo de la temporada de los jugadores

Graficos Radar

Se creo esta función que tiene como proposito realizar un grafico radar recibiendo 5 parametros

player = Nombre del jugador

data1 = Primer set de datos a utilizar

data2 = Segundo set de datos a utilizar

Year1 = Año del primer set de datos evaluado

Year2 = Año del segundo set de datos evaluado

# Función que crea un gráfico de radar interactivo
fun_radar_doble_interactivo <- function(player, data1, data2, year1, year2) {
  # Filtrar y seleccionar las columnas específicas para el jugador
  data1 <- data1 %>% 
    filter(short_name == player) %>% 
    select(pace, shooting, passing, dribbling, defending, physic)
  
  data2 <- data2 %>% 
    filter(short_name == player) %>% 
    select(pace, shooting, passing, dribbling, defending, physic)
  
  # Combinar los datos y agregar años (sin la coma adicional)
  vect_data <- rbind(
    cbind(data1, Year = year1),
    cbind(data2, Year = year2)
  )
  
  # Crear el gráfico de radar interactivo
  radar_chart <- plot_ly(
    type = 'scatterpolar',
    fill = 'toself'
  ) %>%
    add_trace(
      r = as.numeric(vect_data[vect_data$Year == year1, 1:6]),
      theta = names(vect_data)[1:6],
      name = as.character(year1)
    ) %>%
    add_trace(
      r = as.numeric(vect_data[vect_data$Year == year2, 1:6]),
      theta = names(vect_data)[1:6],
      name = as.character(year2)
    ) %>%
    layout(
      polar = list(
        radialaxis = list(
          visible = TRUE,
          range = c(0, 100)
        )
      ),
      title = paste("Comparativa de habilidades de", player)
    )
  
  return(radar_chart)
}

Se realizo una función la cual tiene como proposito recibir 7 parametros en donde el player es el nombre del jugador data1 al 3 es set de datos que queremos evaluar y year1 al 3 el año de la evaluación

# Función que crea un gráfico de radar interactivo
fun_radar_triple_interactivo <- function(player, data1, data2, data3, year1, year2, year3) {
  # Filtrar y seleccionar las columnas específicas para el jugador
  data1 <- data1 %>% 
    filter(short_name == player) %>% 
    select(pace, shooting, passing, dribbling, defending, physic)
  
  data2 <- data2 %>% 
    filter(short_name == player) %>% 
    select(pace, shooting, passing, dribbling, defending, physic)
  
  data3 <- data3 %>% 
    filter(short_name == player) %>% 
    select(pace, shooting, passing, dribbling, defending, physic)
  
  # Combinar los datos y agregar años
  vect_data <- rbind(
    cbind(data1, Year = year1),
    cbind(data2, Year = year2),
    cbind(data3, Year = year3)
  )
  
  # Crear el gráfico de radar interactivo
  radar_chart <- plot_ly(
    type = 'scatterpolar',
    fill = 'toself'
  ) %>%
    add_trace(
      r = as.numeric(vect_data[vect_data$Year == year1, 1:6]),
      theta = names(vect_data)[1:6],
      name = year1
    ) %>%
    add_trace(
      r = as.numeric(vect_data[vect_data$Year == year2, 1:6]),
      theta = names(vect_data)[1:6],
      name = year2
    ) %>%
    add_trace(
      r = as.numeric(vect_data[vect_data$Year == year3, 1:6]),
      theta = names(vect_data)[1:6],
      name = year3
    ) %>%
    layout(
      polar = list(
        radialaxis = list(
          visible = TRUE,
          range = c(0, 100)
        )
      ),
      title = paste("Comparativa de habilidades de", player)
    )
  
  return(radar_chart)
}

Desarrollo Sadio Mané

Sadio Mané desarrollo años 2015 y 2022

fun_radar_doble_interactivo("S. Mané", fdata_22, fdata_15, 2022, 2015)

Sadio Mané desarrollo años 2015,2021 y 2022

fun_radar_triple_interactivo("S. Mané", fdata_22, fdata_21, fdata_15, 2022, 2021, 2015)

Desarrollo Virgil van Dijk

Virgil van Dijk desarrollo años 2015 y 2022

fun_radar_doble_interactivo("V. van Dijk", fdata_22, fdata_15, 2022, 2015)

Virgil van Dijk desarrollo años 2015,2021 y 2022

fun_radar_triple_interactivo("V. van Dijk", fdata_22, fdata_21, fdata_15, 2022, 2021, 2015)

Desarrollo N’Golo Kanté

Virgil van Dijk desarrollo años 2015 y 2022

fun_radar_doble_interactivo('N. Kanté',fdata_22,fdata_15,2022,2015)

N’Golo Kanté desarrollo años 2015,2021 y 2022

fun_radar_triple_interactivo('N. Kanté',fdata_22,fdata_21,fdata_15,2022,2021,2015)

Otros graficos

Pie habil de los jugadores

# Crear el gráfico de pastel interactivo
fun_preferred_foot_pie<-function(data1,year){
data_count1<-data1 %>%
  group_by(preferred_foot) %>% 
  count(preferred_foot)

pastel_chart <- plot_ly(
  data = data_count1,
  labels = ~preferred_foot,
  values = ~n,
  type = 'pie',
  textinfo = 'label+percent',
  insidetextorientation = 'radial',
  marker = list(colors = c( "#79CDCD", "#BC8F8F"))
) %>%
  layout(
    title = paste("Distribución pie habil año", year)
  )
return(pastel_chart)
}
fun_preferred_foot_pie(fdata_15,2015)